package _case

import (
	"fmt"
	"strconv"
	"time"
	"unsafe"
)

func ConvertCase() {
	// 同一类数据转换，数字和数字、字符串和字符、字节
	// 不同类型的数据转换，数字和字符串
	// 接口类型转其他类型

	//数字类型的转换
	var num1 int = 100
	fmt.Println(int64(num1))
	var num2 int64 = 19999
	fmt.Println(int(num2))

	// 字符串与数字类型的转换
	var num3 = 100
	fmt.Println(strconv.Itoa(num3) + "abc") //数字转字符串
	var str1 = "100"
	fmt.Println(strconv.Atoi(str1))

	var num4 int64 = 1010
	fmt.Println(strconv.FormatInt(num4, 10)) //基于10进制转换

	var str2 = "1010"
	fmt.Println(strconv.ParseInt(str2, 10, 64)) //基于10进制转换

	//字符串与[]byte 转换
	var str3 = "哈哈哈哈哈"
	fmt.Println([]byte(str3))
	bytes1 := []byte(str3)
	fmt.Println(string(bytes1))

	//字符串与rune转换
	// rune 为int32类型
	// 将字符串转换为rune切片，实际上runne切片中存储了字符串的Unicode码点
	var rune1 = []rune(str3)
	fmt.Println(rune1)
	fmt.Println(string(rune1))
	fmt.Println(string(rune1[3:5]))
	fmt.Println(string(21704))

	//接口类型转具体类型
	//()是断言 //1、断言用于检查接口类型是否持有特定类型的值；2、断言可以将接口类型转换为具体类型；3、断言用于类型安全的类型转换
	var inf interface{} = user{Name: "王旭东"}
	var infff interface{} = 100
	i, ok := infff.(int)
	fmt.Println(i, ok)
	u, ok := inf.(user)
	fmt.Println(u, ok)

	//时间类型转字符串
	var t time.Time
	t = time.Now()
	timeStr := t.Format("2006-01-02 14:20:02Z07:00") //z07是时区
	fmt.Println(timeStr)
	//字符串转时间
	t2, _ := time.Parse("2006-01-02 14:20:02Z07:00", timeStr)
	fmt.Println(t2)

	//uintptr
	u1 := user{}
	//unsafe.Pointer 是一个通用的指针类型，但是不能用于计算
	uPtr := unsafe.Pointer(&u1)
	// 不参与计算，需要做转换

	namePtr := unsafe.Pointer(uintptr(uPtr) + unsafe.Offsetof(u1.Name))
	*(*string)(namePtr) = "wxd" //结构某一个属性的偏移值，
	fmt.Println(u1)
}
